﻿// Drying POJ - 3104.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstring>
#include <stdio.h>

using namespace std;

//https://vjudge.csgrandeur.cn/problem/POJ-3104


/*

有 n件刚洗完的衣服，其中第 i件衣服上含有 ai单位水分。

自然晾干的情况下，每件衣服每分钟可以减少 1单位水分。

有一个可以使用的烘干机，同一时间仅能容纳最多一件衣服。

在使用烘干机的情况下，每件衣服每分钟可以减少 k 单位水分。

烘干机每次使用的工作时间必须是整数分钟，不足 k单位水分的衣服放入烘干机，
其包含水分最多降低至 0，而不会减为负值。

当衣服包含的水分变为 0 时，表示衣服已经干透了。

请你合理利用烘干机，使得所有衣服干透所需的时间尽可能少。

输出所有衣服干透所需的最小可能分钟数。

输入格式
第一行包含一个整数 n。

第二行包含 n个整数 a1,a2,…,an。

第三行包含一个整数 k。

输出格式
输出一个整数，表示所有衣服干透所需的最小可能分钟数。

数据范围
1≤n≤105,
1≤ai≤109,
1≤k≤109。

输入样例1：
3
2 3 9
5
输出样例1：
3
输入样例2：
3
2 3 6
5
输出样例2：
2
*/

const int N = 100010;
long long arr[N];
long long n, k;
long long l = 1000000010;
long long r = -1;
int t = 1;
bool check(long long  x) {
	long long res = 0;
	long long  cp[N]; memcpy(cp, arr, sizeof arr);
	for (int i = 0; i < n; i++) {
		cp[i] -= x;
		if (cp[i] > 0) {
			res += cp[i] / (k - 1);
			if (cp[i] % (k - 1) != 0) res++;
		}
	}

	if (res > x) return false;
	return true;
}

void solve() {
	while (l < r) {
		long long mid = (1LL * (l + r)) >> 1;
		if (check(mid)) {
			r = mid;
		}
		else {
			l = mid + 1;
		}
	}

	printf("%lld\n", l);
}


int main()
{
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
		l = 0;
		r = max(r, arr[i]);
	}
	cin >> k;
	if (1 == k) {
		printf("%lld", r); return 0;
	}
	solve();


	return 0;
}
